Grupo 03:
Steam es una plataforma de distribución digital de videojuegos, software y contenido multimedia creada por Valve Corporation. Además tiene un ámbito social en torno a los videojuegos en donde a través de un perfil puedes conversar por chat, discutir en foros y compartir momentos en formato de fotos o videos en las comunidades de los distintos juegos. Por otra parte, Steam ofrece características como la integración de logros, estadísticas de juego, recomendaciones de producto, entre otras cosas
Cada vez hay más personas que consumen videojuegos en el mundo, y con ello, más juegos salen al mercado para satisfacer la demanda. Con tantos de ellos, las personas no tienen el tiempo suficiente para probar cada uno de estos.
Como grupo encontramos un interés común con el tema escogido respecto a la manera en que empresas como Steam, donde desarrolladores pueden publicar y vender sus juegos, recomiendan juegos a usuarios de la plataforma o cómo los desarrolladores analizan el mercado para garantizar el éxito de su producto.
Nos gustaría ver si, eventualmente, logramos entender cómo funciona el proceso de recomendación de juegos o qué tipo de juego crear para lanzar en los próximos años por dar algunos ejemplos.
Se usarán 2 DataSets:
Steam Games Dataset: Contiene información sobre cada juego (género de juego, precio, cantidad de reviews, etc).
Game Recommendations on Steam: Contiene información más detallada sobre las reviews de usuarios por juego (positivo/negativo, fecha, horas de juego, ID de usuario, etc).
A pesar de que las tablas tienen distintos atributos, podemos realizar Joins para unirlas, ya que comparten el atributo app_id (ID el cual es dado por Steam y es único para cada juego). Cada review también tiene una propia ID del usuario que la publicó, útil para crear relaciones con respecto al género de los videojuegos.
# @title Imports
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from wordcloud import WordCloud
import os
import csv
import json
# Codigo para que la parte interactiva se vea en el HTML
import plotly.io as pio
pio.renderers.default='notebook'
# @title Exportación de Drive
from google.colab import drive
drive.mount('/content/drive')
Mounted at /content/drive
Primero cargamos los datos que serán usados para nuestra exploración de datos.
# @title Carga de DataFrames
df_games = pd.read_csv('/content/drive/MyDrive/CC5205/games.csv', encoding="UTF-8")
df_recom = pd.read_csv('/content/drive/MyDrive/CC5205/recommendations.csv', encoding="UTF-8")
df_recom.head()
| app_id | helpful | funny | date | is_recommended | hours | user_id | review_id | |
|---|---|---|---|---|---|---|---|---|
| 0 | 975370 | 0 | 0 | 2022-12-12 | True | 36.3 | 51580 | 0 |
| 1 | 304390 | 4 | 0 | 2017-02-17 | False | 11.5 | 2586 | 1 |
| 2 | 1085660 | 2 | 0 | 2019-11-17 | True | 336.5 | 253880 | 2 |
| 3 | 703080 | 0 | 0 | 2022-09-23 | True | 27.4 | 259432 | 3 |
| 4 | 526870 | 0 | 0 | 2021-01-10 | True | 7.9 | 23869 | 4 |
Podemos tomar a un usuario que haya recomendado a lo menos dos juegos y revisar sus preferencias con respecto a los juegos que le hayan gustado y sus respectivos géneros. Si realizamos esto con un mayor número de jugadores se podrían encontrar patrones entre géneros de videojuegos, los cuales podrían ser estudiados ocupando visualizacion de datos, en específico, WordCloud.
# @title WordCloud
wordcloud = WordCloud(width=800, height=400, background_color='white').generate(df_games['genres'].to_string())
#Mostrar la nube de palabras
plt.figure(figsize=(10, 5))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off') #Desactivar los ejes
plt.show()
Como se puede ver, la gran mayoría corresponde a juegos de acción y aventura (que suele ser la mayoría de las producciones AAA). Además, se repite la palabra indie, que hace alusión a aquellos juegos creados por desarrolladores independientes.
Podemos ver la satisfacción general de todos los usuarios de steam comparando la cantidad de juegos recomendados v/s los no recomendados.
frequency_recom = df_recom['is_recommended'].value_counts()
# Mostrar la tabla de frecuencias
print(frequency_recom)
is_recommended True 35304398 False 5850396 Name: count, dtype: int64
Otro análisis que haríamos sería buscar una posible relación entre el precio de los juegos y la cantidad de reviews de los usuarios. La mejor herramienta que nos ayudará a estudiar esto es un diagrama de dispersión. Además, mostraremos los outliers para dar cuenta de situaciones particulares dentro de la plataforma.
# @title Diagrama de Dispersión
import plotly.express as px
# Crear el scatter plot
fig_scatter = px.scatter(df_games,
x='price',
y='recommendations',
color='metacritic_score',
title='Scatter Plot: Precio vs Número Total de Reseñas',
labels={'price': 'Precio (USD)', 'recommendations': 'Número Total de Recomendaciones'})
fig_scatter.show()
Del gráfico podemos notar que todo juego sobre los 75 dólares en adelante tiene una puntuación de 0 (según la tabla de colores a la derecha, no son puntuaciones mayores a 10 al parecer) ya sea por una mala puntuación de parte de metacritic o simplemente no fueron puntuados. Por otro lado, notamos que juegos con puntuaciones altas en Metacritic suelen ser juegos de no más de 30 dólares y con al menos 100 mil reseñas.
Sumado a esto, si revisamos los outliers, los juegos más caros no tienen ni reseñas ni puntuación, ya que los usuarios deben comprar el producto, mientras que el juego con más reviews (por sobre 3 millones) tiene un rating muy alto, seguido de otros dos juegos con sobre 1 millón de reseñas, donde uno está mal evaluado y el otro bien calificado.
# @title Gráfico de Barras 1
import plotly.graph_objs as go
import plotly.offline as pyo
# Filtrar los datos para que muestre juegos con reviews tanto positivas como negativas
filter = df_games[(df_games['positive'] > 0) &
(df_games['negative'] > 0)]
top_games = filter[filter["name"] != "Grand Theft Auto V"].sort_values(by='metacritic_score', ascending=False).head(3)
# Crear la figura de barras
fig = go.Figure(go.Bar(
x=top_games['name'],
y=top_games['positive']
))
# Actualizar el diseño del gráfico
fig.update_layout(
title='Cantidad de reviews positivas del top 3 de juegos con mejor puntaje de metacritic',
xaxis=dict(title='Juegos'),
yaxis=dict(title='Cantidad')
)
fig.show()
# @title Gráfico de Barras 2
# Crear la figura de barras
fig = go.Figure(go.Bar(
x=top_games['name'],
y=top_games['negative']
))
# Actualizar el diseño del gráfico
fig.update_layout(
title='Cantidad de reviews negativas del top 3 de juegos con mejor puntaje de metacritic',
xaxis=dict(title='Juegos'),
yaxis=dict(title='Cantidad')
)
fig.show()
Con respecto a estos gráficos de barra, queríamos ver si era posible observar algo con respecto a un top 3 de juegos de Steam con mejor puntuación en Metacritic y contrastarlo con la cantidad de reviews positivas y negativas que recibieron en Steam. Dentro del top 3 se encontraba "Grand Theft Auto V", el cual decidimos remover puesto que, en comparación con los otros juegos, la cantidad de reseñas de jugadores que recibió era mucho mayor, lo que entorpecía la visualización de los gráficos. Es importante destacar que la puntuación en Metacritic y las reseñas positivas y negativas de Steam de un juego son eventos separados.
A partir de nuestra motivación y lo que encontramos en la exploración preliminar de datos, nos surgieron las siguientes preguntas que encontramos interesantes para estudiar el dataset:
>